package com.cx330;

public class Example36 {
    public static void main(String[] args) {
        Father36 father = new Father36();
        Son36 son = new Son36();
        Daughter daughter = new Daughter();
        MyClass myClass = new MySub();
        /**
        1. 静态分派：看myClass的编译时类型MyClass，在MyClass中找最匹配的
        匹配的原则：看实参的编译时类型与方法形参的类型的匹配程度
        - 找最匹配：实参的编译时类型 = 方法形参的类型
        - 找兼容：实参的编译时类型 < 方法形参的类型
        实参father的编译时类型是Father36，形参(Father36 father)、(Son36 son)
        2. 动态绑定：看myClass的运行时类型MySub
         */
        /*
        1. 最匹配的是public void method(Father36 father)
        2. 看在MySub中是否有对public void method(Father36 father)重写
        如果有重写，就执行重写的
         */
        myClass.method(father); // sub--father
        /*
        1. 最匹配的是public void method(Son36 son)
        2. 看在MySub中是否有对public void method(Son36 son)重写
        如果没有重写，就执行刚刚父类中找到的方法
         */
        myClass.method(son); // son
        /*
        1. 最匹配的是public void method(Father36 father)
        2. 看在MySub中是否有对public void method(Father36 father)重写
        如果有重写，就执行重写的
         */
        myClass.method(daughter); // sub--father
    }
}

class MyClass {
    public void method(Father36 father) {
        System.out.println("father");
    }

    public void method(Son36 son) {
        System.out.println("son");
    }
}

class MySub extends MyClass {
    public void method(Father36 father) {
        System.out.println("sub--father");
    }

    public void method(Daughter daughter) {
        System.out.println("daughter");
    }
}

class Father36 {

}

class Son36 extends Father36 {

}

class Daughter extends Father36 {

}